package com.hspedu.qqserver.service;

import com.hspedu.qqcommon.Message;
import com.hspedu.qqcommon.MessageType;
import com.hspedu.utils.Utility;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.HashMap;

/**
 * @author 谷其昊
 * @version 1.0
 * @date 2022/3/21
 * @time 11:24
 */
public class SendNewsToAllService implements Runnable {

    @Override
    public void run() {
        String content;
        boolean loop = true;
        while (loop) {
            HashMap<String, ServerConnectClientThread> allServerThreads =
                    ManageServerConnectClientThread.getAllServerThreads();
            //先判断当前是否有在线用户
            if (allServerThreads.size() != 0) {
                System.out.println("当前有用户在线，请输入推送的内容（输入exit退出）");
                //不需要线程休眠，因为这里本身就会阻塞等待输入
                content = Utility.readString(100);
                //判断当前是否要退出
                if (!"exit".equals(content)) {
                    for (ServerConnectClientThread thread : allServerThreads.values()) {
                        Socket socket = thread.getSocket();
                        Message message = new Message();
                        message.setSender("服务器");
                        message.setContent(content);
                        message.setMessageType(MessageType.MESSAGE_TO_ALL);
                        QQServerService.setMessageSendTime(message);
                        try {
                            //注意这里每次都要重新创建一个流对象，不能一个输出流对象一下次把所有信息发送完
                            //因为客户端接收时每次都是创建一个新的输入流读取数据
                            //如果不是每次都创建一个新的输出流就会导致输入流、输出流不是一一对应的
                            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                            oos.writeObject(message);
                            oos.flush();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                } else {
                    loop = false;
                    System.out.println("推送服务线程关闭");
                }
            }
        }
    }
}
